﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
//using ENProyectoSIETE;
//using CADProyectoSIETE;
using ENProyecto7;
using System.IO;

namespace ProyectoSIETE
{
    public partial class frmGestionMapas : Form
    {
        // Crear los arraylist donde se insertaran temporalmente los objetos y enemigos de las localizaciones
        private ArrayList localizaciones = new ArrayList();
        private BindingSource bsLo;
        private string rutaMapa = "";
        private string directorioImagenes = @"..\..\..\WebProyectoSiete\img\";

        private bool editando = false;

        public frmGestionMapas()
        {
            InitializeComponent();
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {

        }

        private void frmGestionMapas_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Mapa' Puede moverla o quitarla según sea necesario.
            this.mapaTableAdapter.Fill(this.bDProyecto7DataSet.Mapa);
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Localizacion' Puede moverla o quitarla según sea necesario.
            //this.localizacionTableAdapter.Fill(this.bDProyecto7DataSet.Localizacion);
            ENMapa mapa = new ENMapa();
            dataGridView1.DataSource = mapa.obtenerMapas();

            ENLocalizacion localizacion = new ENLocalizacion();
            dgvLocalizacion.DataSource = localizacion.obtenerLocalizaciones();
        }

        private void btnSubirMapa_Click(object sender, EventArgs e)
        {
            DialogResult resultado = ofdSubirMapa.ShowDialog();
            if (resultado == DialogResult.OK)
            {
                rutaMapa = ofdSubirMapa.FileName;
                pbMapa.ImageLocation = ofdSubirMapa.FileName;
            }
        }

        private void pbMapa_Click(object sender, EventArgs e){}

        private void pbMapa_MouseUp(object sender, MouseEventArgs e)
        {
            try
            {
                if (rutaMapa != "")
                {
                    nudX.Value = (decimal)e.X;
                    nudY.Value = (decimal)e.Y;
                }
            }
            catch{
                MessageBox.Show("Pulsa dentro de la imagen","ERROR");
            }
             
        }

        private void btnAgregarLocalizacion_Click(object sender, EventArgs e)
        {
            ENMapaLocalizacion localizacion = new ENMapaLocalizacion();
            try
            {
                localizacion.IDLocalizacion = int.Parse(dgvLocalizacion.CurrentRow.Cells[0].Value.ToString());
                localizacion.Nombre = dgvLocalizacion.CurrentRow.Cells[1].Value.ToString();
                localizacion.CordX = int.Parse(nudX.Value.ToString());
                localizacion.CordY = int.Parse(nudY.Value.ToString());
                
                localizaciones.Add(localizacion);
                // Insertar las localizaciones en el data grid
                bsLo = new BindingSource(localizaciones, "");
                dgvLocalizacionesMapa.DataSource = bsLo;
                if (localizaciones.Count > 0)
                {
                    dgvLocalizacionesMapa.Columns[0].Visible = false;
                }
                /*MapaCAD cadmapa = new MapaCAD();
                dataGridView1.DataSource = cadmapa.obtenerMapas();
                dataGridView1.DataMember = "mapa";*/
            }
            catch
            {
                MessageBox.Show("Error al intentar agregar la localizacion");
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if(editando)
            {
                ep.SetError(tbNombreMapa, "");

                bool error = false;
                // Entidad donde se almacenarán los datos temporalmente para hacer el insert en la bd
                ENMapa mapa = new ENMapa();

                string patronNombre = @"^[A-Z]{1}[a-zA-Z0-9]+$";

                // Controlar que el nombre está rellenado y que tenga un formato válido
                if (tbNombreMapa.Text != "")
                {
                    if (!(Regex.Match(tbNombreMapa.Text, patronNombre).Success))
                    {
                        ep.SetError(tbNombreMapa, "Sólo se admiten carácteres para el nombre, y debe comenzar por una mayúscula.");
                        error = true;
                    }
                }
                else
                {
                    ep.SetError(tbNombreMapa, "El mapa debe tener nombre.");
                    error = true;
                }
                if (rutaMapa == "")
                {
                    ep.SetError(btnSubirMapa, "Debes subir una imagen para el mapa.");
                    error = true;
                }
                if (!error)
                {
                    try
                    {

                        string[] ficheroMapa = rutaMapa.Split(new char[] { '\\' });

                        string imagenMapa = ficheroMapa[ficheroMapa.Length - 1];


                        // Entidad donde se almacenarán los datos temporalmente para hacer el insert en la bd
                        ENMapa mapaEN = new ENMapa(tbNombreMapa.Text, tbDescripcion.Text, imagenMapa);
                        mapaEN.LocalizacionesMapa = localizaciones;
                        mapaEN.IdMapa = int.Parse(lbIdMapa.Text);

                        //---Copiamos la imagen al directorio "imagenes" del proyecto

                        string ficheroDestino = Path.Combine(directorioImagenes, imagenMapa);

                        //---Si la carpeta "Imagenes" dentro del proyecto no exisitiera, la crearíamos
                        if (Directory.Exists(directorioImagenes))
                        {
                            Directory.CreateDirectory(directorioImagenes);
                        }

                        //---Copiamos el fichero (si el usuario ha elegido uno)
                        if (rutaMapa != "")
                        {
                            File.Copy(rutaMapa, ficheroDestino, true);
                        }
                        // se inserta el nuevo objeto en la BD                 
                        mapaEN.editarMapa();

                        dataGridView1.DataSource = mapaEN.obtenerMapas();
                    }
                    catch
                    {
                        MessageBox.Show("Se ha producido un error al intentar editar el mapa");
                    }
                }
            }
            else
            {
                ep.SetError(tbNombreMapa, "");

                bool error = false;
                // Entidad donde se almacenarán los datos temporalmente para hacer el insert en la bd
                ENMapa mapa = new ENMapa();

                string patronNombre = @"^[A-Z]{1}[a-zA-Z0-9]+$";

                // Controlar que el nombre está rellenado y que tenga un formato válido
                if (tbNombreMapa.Text != "")
                {
                    if (!(Regex.Match(tbNombreMapa.Text, patronNombre).Success))
                    {
                        ep.SetError(tbNombreMapa, "Sólo se admiten carácteres para el nombre, y debe comenzar por una mayúscula.");
                        error = true;
                    }
                }
                else
                {
                    ep.SetError(tbNombreMapa, "El mapa debe tener nombre.");
                    error = true;
                }
                if (rutaMapa == "") {
                    ep.SetError(btnSubirMapa, "Debes subir una imagen para el mapa.");
                    error = true;
                }
                if (!error) {
                    try
                    {

                        string[] ficheroMapa = rutaMapa.Split(new char[] { '\\' });

                        string imagenMapa = ficheroMapa[ficheroMapa.Length - 1];


                        // Entidad donde se almacenarán los datos temporalmente para hacer el insert en la bd
                        ENMapa mapaEN = new ENMapa(tbNombreMapa.Text, tbDescripcion.Text, imagenMapa);
                        mapaEN.LocalizacionesMapa = localizaciones;

                        //---Copiamos la imagen al directorio "imagenes" del proyecto

                        string ficheroDestino = Path.Combine(directorioImagenes, imagenMapa);

                        //---Si la carpeta "Imagenes" dentro del proyecto no exisitiera, la crearíamos
                        if (Directory.Exists(directorioImagenes))
                        {
                            Directory.CreateDirectory(directorioImagenes);
                        }

                        //---Copiamos el fichero (si el usuario ha elegido uno)
                        if(rutaMapa != ""){
                            File.Copy(rutaMapa, ficheroDestino, true);
                        }
                        // se inserta el nuevo objeto en la BD                 
                        mapaEN.insertarMapa();

                        dataGridView1.DataSource = mapaEN.obtenerMapas();                       
 
                    }
                    catch 
                    {
                        MessageBox.Show("Se ha producido un error al crear el mapa");
                    }
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea borrar el mapa " + dataGridView1.CurrentRow.Cells[0].Value.ToString() + "?", "Confirmar borrado", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    ENMapa mapa = new ENMapa();
                    mapa.IdMapa = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
                    mapa.borrarMapa();

                    dataGridView1.DataSource = mapa.obtenerMapas();
                    MessageBox.Show("Mapa borrado", "", MessageBoxButtons.OK);

                    editando = false;
                }
                catch
                {
                    MessageBox.Show("Se ha producido un error al intentar borrar el mapa");
                }
            }
        }

        private void tbBuscar_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void textBox1_MouseClick(object sender, MouseEventArgs e)
        {
            textBox1.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                DataTable resultado = new DataTable();
                ENMapa mapa = new ENMapa();

                mapa.NombreMapa = textBox1.Text;

                resultado = mapa.obtenerMapaNombre("nombre");

                if (resultado.Rows.Count == 0)
                {
                    MessageBox.Show("No se ha encontrado ninguna coincidencia");
                }
                else
                {
                    dataGridView1.DataSource = resultado;
                    dataGridView1.Refresh();
                }
            }
            catch
            {
                MessageBox.Show("Se ha producido un error al intentar buscar el mapa");
            }

        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                editando = true;

                ENMapa mapa = new ENMapa();

                mapa.IdMapa = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
                mapa.obtenerMapa();

                tbNombreMapa.Text = mapa.NombreMapa;
                if(mapa.ImagenMapa != ""){
                    if (File.Exists(directorioImagenes + mapa.ImagenMapa))
                        pbMapa.ImageLocation = directorioImagenes + mapa.ImagenMapa;
                    else
                        pbMapa.ImageLocation = directorioImagenes + "sin_imagen.png";
                }
                tbDescripcion.Text = mapa.DescripcionMapa;
                lbIdMapa.Text = mapa.IdMapa.ToString();

                //Recuperamos las localizaciones asociadas al mapa
                localizaciones = mapa.LocalizacionesMapa;

                //Actualizamos el DataGrid de localizaciones
                bsLo = new BindingSource(localizaciones, "");

                dgvLocalizacionesMapa.DataSource = bsLo;

                //Escondemos el ID, comprobamos que haya filas para que no se produzca error
                if(localizaciones.Count > 0){
                    dgvLocalizacionesMapa.Columns[0].Visible = false;
                }
            }
            catch
            {
                MessageBox.Show("Se ha producido un error al intentar cargar el mapa");
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            tbNombreMapa.Text = "";
            tbDescripcion.Text = "";
            pbMapa.ImageLocation = "";

            try
            {
                localizaciones.Clear();

                bsLo = new BindingSource(localizaciones, "");

                dgvLocalizacionesMapa.DataSource = bsLo;

                editando = false;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        private void frmGestionMapas_Enter(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Mapa' Puede moverla o quitarla según sea necesario.
            this.mapaTableAdapter.Fill(this.bDProyecto7DataSet.Mapa);
            // TODO: esta línea de código carga datos en la tabla 'bDProyecto7DataSet.Localizacion' Puede moverla o quitarla según sea necesario.
            //this.localizacionTableAdapter.Fill(this.bDProyecto7DataSet.Localizacion);
            ENMapa mapa = new ENMapa();
            dataGridView1.DataSource = mapa.obtenerMapas();

            ENLocalizacion localizacion = new ENLocalizacion();
            dgvLocalizacion.DataSource = localizacion.obtenerLocalizaciones();
        }
    }
}